package com.example.permission.utils.tags;

import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.context.WebEngineContext;
import org.thymeleaf.engine.AttributeName;
import org.thymeleaf.model.IAttribute;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.standard.processor.AbstractStandardConditionalVisibilityTagProcessor;
import org.thymeleaf.templatemode.TemplateMode;

import java.util.Set;

/**
 * 自定义标签类
 */
public class AuthTag extends AbstractStandardConditionalVisibilityTagProcessor {

    /**
     *
     * @param templateMode 适用于什么模板
     * @param dialectPrefix 前缀
     * @param attrName  属性名称
     * @param precedence 优先级
     */
    public AuthTag() {
        super(TemplateMode.HTML, "permission", "hasMenu", 1000);
    }



    /**
     * 控制标签是否显示
     * @param iTemplateContext 可以获取web的隐藏域 如 request session
     * @param iProcessableElementTag 获取页面属性的属性值
     * @param attributeName 属性名称
     * @param s
     * @return
     */
    @Override
    protected boolean isVisible(ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, AttributeName attributeName, String s) {
            //先获取前缀和属性，然后再通过这个获取属性值，这些是获取页面的值
        IAttribute attribute = iProcessableElementTag.getAttribute("permission", "hasMenu");
        String value = attribute.getValue(); //这个获取的就是前端的permission:hasMenu="true",获取true
        //这个是获取数据库里的值，然后做比较
        Set<String> permissionNames = (Set<String>)((WebEngineContext) iTemplateContext).getRequest().getSession().getAttribute("permissionNames");
        for (String permissionName : permissionNames) {
            if(permissionName.equals(value)){
               return true;
            }
        }
        //true是显示，false是不显示
        return false;
    }
}
